"""
SqlAlchermy limit、offset以及切片操作
1. limit：可以限制每次查询的时候只查询几条数据
2. offset：可以限制查找数据的时候过滤掉前面多少条
3. 切片：可以对Query对象使用切片操作，来获取想要的数据
"""
import os
import sys

path = os.path.dirname(__file__)
sys.path.append(os.path.join(path, '..'))

from faker import Faker
from datetime import datetime
from sqlalchemy import Column, Integer, Text, DateTime
from conf.mysql_config import SESSION, BASE
from utils.random_time import gen_random_time


class News(BASE):
    __tablename__ = 'news'
    id = Column(Integer, autoincrement=True, primary_key=True)
    content = Column(Text, comment='内容', doc={'zh': '内容'})
    create_time = Column(DateTime, default=datetime.now, comment='创建日期', doc={'zh': '创建日期'})

    def __str__(self):
        return f'<News content={self.content}, create_time={self.create_time}>'

    __repr__ = __str__


BASE.metadata.create_all()


def add_data():
    fake = Faker(locale='zh_CN')
    news = [News(content=fake.text(), create_time=datetime.strptime(gen_random_time().get('date'), '%Y-%m-%d %H:%M:%S'))
            for _ in range(100)]
    SESSION.add_all(news)
    SESSION.commit()


def search_data():
    # 1. limit: 可以限制每次查询的时候只查询几条数据
    news = SESSION.query(News).order_by(News.create_time.desc()).limit(10).all()
    # 2. offset：可以限制查找数据的时候过滤掉前面多少条
    news = SESSION.query(News).order_by(News.create_time.desc()).offset(10).limit(10).all()
    # 3. 切片：可以对Query对象使用切片操作，来获取想要的数据
    news = SESSION.query(News).order_by(News.create_time.desc()).slice(0, 10).all()
    news = SESSION.query(News).order_by(News.create_time.desc())[0:10]
    for msg in news:
        print(msg)


if __name__ == '__main__':
    search_data()
